package com.skyyan.netty.jjf.codec;

/**
 * CRC8 校验工具类
 * 多项式: x^8 + x^2 + x + 1 (0x07)
 * 这是一个标准的CRC-8-ATM HEC算法实现
 * @author skyyan
 */
public final class Crc8Util {
    private Crc8Util() {}

    private static final int POLYNOMIAL = 0x07;
    private static final int[] CRC_TABLE = new int[256];

    // 静态初始化CRC查找表，提高计算效率
    static {
        for (int i = 0; i < 256; i++) {
            int crc = i;
            for (int j = 0; j < 8; j++) {
                if ((crc & 0x80) != 0) {
                    crc = (crc << 1) ^ POLYNOMIAL;
                } else {
                    crc <<= 1;
                }
            }
            CRC_TABLE[i] = crc & 0xFF;
        }
    }

    /**
     * 计算给定字节数组的CRC8校验值
     * @param data 待校验的数据
     * @return CRC8校验值
     */
    public static byte calculate(byte[] data) {
        if (data == null || data.length == 0) {
            return 0;
        }

        int crc = 0;
        for (byte b : data) {
            crc = CRC_TABLE[(crc ^ (b & 0xFF)) & 0xFF];
        }
        return (byte) crc;
    }

    /**
     * 验证数据的CRC8校验值
     * @param data 原始数据
     * @param expectedCrc 期望的CRC值
     * @return true表示校验通过，false表示校验失败
     */
    public static boolean verify(byte[] data, byte expectedCrc) {
        return calculate(data) == expectedCrc;
    }

    /**
     * 获取CRC查找表（用于调试）
     * @return CRC查找表的副本
     */
    public static int[] getCrcTable() {
        return CRC_TABLE.clone();
    }
}

